package com.junpuxin.util;

import com.alibaba.excel.EasyExcel;
import jakarta.servlet.http.HttpServletResponse;
import lombok.SneakyThrows;

import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.util.Collection;

/** @author 周航宇 */
public class EasyExcelUtil {

    /**
     * 生成Excel报表并自动下载
     *
     * @param resp      HTTP响应对象
     * @param fileName  Excel文件名，可以省略 .xlsx 后缀
     * @param data      数据
     */
    @SneakyThrows
    public static void download(HttpServletResponse resp,
                                String fileName,
                                Collection<?> data) {
        // 若 fileName 未包含 .xlsx 后缀，则添加
        if (!fileName.endsWith(".xlsx")) {
            fileName += ".xlsx";
        }
        // 对文件名重新编码，以避免文件名中文乱码问题
        fileName = URLEncoder.encode(fileName, StandardCharsets.UTF_8);
        // 设置响应MIME类型为Excel文件下载类型
        resp.setContentType("application/vnd.openxmlformats-officedocument" +
                ".spreadsheetml.sheet;charset=utf-8");
        // 设置以附件的形式下载文件
        resp.setHeader("Content-disposition", "attachment;filename=" + fileName);
        // 通过 data 获取泛型的类型
        Class<?> type = data.iterator().next().getClass();
        // 生成Excel报表并自动下载
        EasyExcel.write(resp.getOutputStream(), type).sheet("sheet01").doWrite(data);
    }
}